iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Modern Web

Rails,我要進來囉系列 第 7

第七天:ActionMailer 跟 Controller 很像!?

  • 分享至 

  • xImage
  •  

開場白

鼬~~哩賀,我是寫程式的山姆老弟,昨天跟大家一起看了一點 ActiveJob 的運作方式,今天就來看一下 ActionMailer 是在幹嘛的吧,夠夠~

https://github.com/shrimp509/my-img-host/blob/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day7-1.png?raw=true

ActionMailer 負責處理寄信

沒錯,從 ActionMailer 的名字看起來,就是用來處理跟信件相關的東東,ActionMailer 主要是方便我們將使用者資料和信件內容做結合,並且指定寄件人、收件人是誰。

電子郵件已經是網站中很日常的一環,Rails 作為網站設計的框架,也會需要常常發送系統相關的信件,常見的有註冊會員時的驗證信、驗證完成後的歡迎信、偶爾發送的系統維護信、定期發送的 EDM 行銷信,而 ActionMailer 就是方便我們使用 Rails 來發信的工具。

ActionMailer 有什麼特色?

它用起來的感覺就很像 Rails 的 Controller,有自己的 action (Email 所需的資料)、有自己的 view (Email 的內容),我們來試玩玩看

ActionMailer 怎麼使用?

創一個 User Mailer

$ rails g mailer user

create  app/mailers/user_mailer.rb
invoke  erb
create    app/views/user_mailer
invoke  test_unit
create    test/mailers/user_mailer_test.rb
create    test/mailers/previews/user_mailer_preview.rb

新增歡迎信

我們在 UserMailer 新增一個 welcome_email 的 method,這代表一種類型的信件,看起來很像 Controller 的樣子吧,把待會 view 裡面會需要用的資料,在 action 這邊準備好

# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
	default from: email_address_with_name('course@relacs-studio.com', '山姆老弟')

	def welcome_email
		@user = params[:user]
		@url = 'https://course.relacs-studio.com'
		mail(to: @user.email, subject: '[Test] 歡迎新會員')
	end
end

設定歡迎信的內容

然後在 app/views/user_mailer 中,新增一個 welcome_email.rb 的檔案,寫上我們想要寄出去的內容,而且是用 HTML 的樣式來包,這樣看起來是不是真的很像在寫一般的 Controller 和 View 啊~

# app/views/user_mailer/welcome_email.rb
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Welcome to course.relacs-studio.com, <%= @user.name %></h1>
    <p>
      You have successfully signed up to course.relacs-studio.com,
      your username is: <%= @user.login %>.<br>
    </p>
    <p>
      To login to the site, just follow this link: <%= @url %>.
    </p>
    <p>Thanks for joining and have a great day!</p>
  </body>
</html>

寄信前預覽 [Optional]

# test/mailers/previews/user_mailer_preview.rb
class UserMailerPreview < ActionMailer::Preview
  def welcome_email
    UserMailer.with(user: User.first).welcome_email
  end
end

然後打開 http://localhost:3000/rails/mailers/user_mailer/welcome_email 就可以看到信件的樣子了

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day7-2.png

ps. 如果要更換 user_email_preview.rb 的放置位置的話,可以用 preview_path 來改,這邊假設要從 test/mailers/previews 改成 lib/mailer_previews 的話,那就用以下方式改

# config/application.rb
config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"

這些跟 Rails 相關的設定,會再之後的某一篇來看~

寄信,發射!

最後要寄信的時候,只要呼叫 UserMailer.with(user: user).welcome_email.deliver_later 就好囉,這邊有一點很貼心,就是 .with 所帶進去的 key 會在 mailer 中轉為 params,所以你需要什麼資料,就記得在 with 的時候帶進去、在 mailer 中用 params 撈出來就好了~

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day7-3.png

總結

其實到最後收到信中間,還略過了一部分步驟沒寫到,就是串寄信的服務商,在本地開發的 mailer 直接寄出到 gmail,應該是收不到的,必須仰賴第三方的 mail server (Delivery Agent)幫忙寄信,gmail 才會覺得這是正式的 email,所以明天來紀錄一下我是怎麼串 AWS SES 的,我們明天見~


上一篇
第六天:躲在 Rails 背後默默付出的幕後功臣 - ActiveJob
下一篇
第八天:ActionMailer 串 AWS SES 寄信
系列文
Rails,我要進來囉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言